// middleware.js
const jwtUtil = require("./jwtutil"); // 导入token模块
const releaseArr = require("./release.js"); // 不需要验证Token的路由
const {addAccessStatisticsLog} = require("../data/accessStatistics.js"); // 引入访问统计相关函数

/**
 * 路由验证器
 * @param {*} ctx 上下文
 * @param {*} next 放行
 * @returns 
 */
async function tokenValidator(ctx, next) {
  // 放行swagger
  if (ctx.path.includes("/docs"||"/favicon.png")) {
    await next();
    return;
  }
  // 如果访问的是静态资源则不统计
  if (ctx.path.includes("/file")) {
    await next();
    return;
  }
  addAccessStatisticsLog(ctx.path)
  // 检查当前请求的路径是否在releaseArr中，如果在，则跳过Token验证
  if (releaseArr.includes(ctx.path)) {
    await next();
  } else {
    // 从请求头中获取Token
    const token = ctx.headers.authorization;
    // 如果没有Token
    if (!token) {
      ctx.body = { code: -99, message: "数据异常,请重新登录！！！" };
      return;
    }
    // 验证Token
    try {
      const tokenObj = jwtUtil.decrypt(token); // Token的验证函数
      if (!tokenObj.token) {
        ctx.body = {
          code: -98,
          message: "token验证失败或登录过期!!!",
        };
        return;
      }
      // 将Token信息存入ctx中，供后续中间件使用
      ctx.tokenObj = tokenObj;
      await next();
    } catch (err) {
      ctx.status = 401;
      ctx.body = { error: "Unauthorized. Invalid token." };
    }
  }
}
module.exports = {
  tokenValidator,
};